Spring-Cloud-Gateway源码分析系列 | Spring-Cloud-Gateway之Route初始化加载

推荐 Spring Boot/Cloud 视频:

Spring-Cloud-Gateway路由信息是通过路由定位器RouteLocator加载以及初始化的接下来阅读源码看下Spring-Cloud-Gateway是怎么一步一步的实现了路由的加载初始化。

首选我们还是在Spring-Cloud-Gateway初始化配置中看Spring-Cloud-Gateway初始化是创建了路由定位相关的那些类

------------- GatewayAutoConfiguration类
    /**
     * 创建一个根据RouteDefinition转换的路由定位器
     */
    @Bean
    public RouteLocator routeDefinitionRouteLocator(GatewayProperties properties,
                                                   List<GatewayFilterFactory> GatewayFilters,
                                                   List<RoutePredicateFactory> predicates,
                                                   RouteDefinitionLocator routeDefinitionLocator) {
        return new RouteDefinitionRouteLocator(routeDefinitionLocator, predicates, GatewayFilters, properties);
    }

    /**
     * 创建一个缓存路由的路由定位器
     * @param routeLocators
     * @return
     */
    @Bean
    @Primary//意思是在众多相同的bean中,优先使用用@Primary注解的bean.
    //TODO: property to disable composite?
    public RouteLocator cachedCompositeRouteLocator(List<RouteLocator> routeLocators) {
        
        //1.创建组合路由定位器,根据(容器)已有的路由定位器集合
        //2.创建缓存功能的路由定位器
        return new CachingRouteLocator(new CompositeRouteLocator(Flux.fromIterable(routeLocators)));
    }

从初始化配置类中可以路由定位器的创建流程

1.RouteDefinitionRouteLocator
2.CompositeRouteLocator
3.CachingRouteLocator

  • 其中 RouteDefinitionRouteLocator 是获取路由的主要地方,CompositeRouteLocator,CachingRouteLocator对路由定位器做了附加功能的包装,最终使用的是CachingRouteLocator对外提供服务

下来阅读RouteLocator 接口源码:

/**
 * 路由定位器,服务获取路由信息
 * 1.可以通过 RouteDefinitionRouteLocator 获取 RouteDefinition ,并转换成 Route
 * @author Spencer Gibb
 */
//TODO: rename to Routes?
public interface RouteLocator {

    /**
     * 获取路由
     * @return
     */
    Flux<Route> getRoutes();
}

接口很简单,有且只有一个获取路由的方法,专门用来获取路由。
RouteLocator 类图如下:

graph TD
RouteLocator-->|缓存功能实现|CachingRouteLocator
RouteLocator-->|组合功能实现|CompositeRouteLocator
RouteLocator-->|通过路由定义转换路由实现|RouteDefinitionRouteLocator

接下来我们依次阅读具体实现类

CachingRouteLocator
/**
 * 路由定位器的包装类,实现了路由的本地缓存功能
 * @author Spencer Gibb
 */
public class CachingRouteLocator implements RouteLocator {

    /**
     * 目标路由定位器
     */
    private final RouteLocator delegate;

    /**
     * 路由信息
     * Flux 相当于一个 RxJava Observable,
     * 能够发出 0~N 个数据项,然后(可选地)completing 或 erroring。处理多个数据项作为stream
     */
    private final Flux<Route> routes;

    /**
     * 本地缓存,用于缓存路由定位器获取的路由集合
     *
     */
    private final Map<String, List>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值